# 作者: Mark
# 2023年03月10日11时24分54秒
from socket import *
import struct

#
tcp_client_socket = socket(AF_INET,SOCK_STREAM)
#
addr = ('192.168.21.136',2000)
#
tcp_client_socket.connect(addr)
#

#接文件名
train_head_len = tcp_client_socket.recv(4) #先接收4个字节的火车头，文件名的长度
file_name_len = struct.unpack('I',train_head_len)[0]
total = 0
while total < file_name_len:
    #recv()每次从接受缓存区里读取一次上限只为64k
    #所以当文件内容过大时，缓冲区一次放不下，在只读取一次缓冲区的情况下，剩余文件内容必定读取不到，故需要设置循环读取
    file_name = tcp_client_socket.recv(file_name_len-total)
    total+=len(file_name)
    print(file_name)



##根据文件名创建文件,并接受文件内容
file = open(file_name,'wb') #没有此文件名自动在客户端创建新的文件名，并赋给变量file
train_head_len = tcp_client_socket.recv(4) #先接收4个字节的火车头，文件内容的长度
file_contect_len = struct.unpack('I',train_head_len)[0]
total = 0
while total < file_contect_len:
    #recv()每次从接受缓存区里读取一次上限只为64k
    #所以当文件内容过大时，缓冲区一次放不下，在只读取一次缓冲区的情况下，剩余文件内容必定读取不到，故需要设置循环读取
    file_contect = tcp_client_socket.recv(file_contect_len-total)
    total += len(file_contect)
    file.write(file_contect) #写入新的文件内
file.close()

#关闭套接字进程
tcp_client_socket.close()

